home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / ARCCOT.CMD < prev    next >
OS/2 REXX Batch file  |  1997-05-01  |  4KB  |  127 lines

  1. /* REXX-Programm arccot.cmd */
  2. /* Pi24=π/2                 */
  3.  
  4.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  5.    Call SysLoadFuncs
  6.    Signal on syntax name arccotMsg
  7.  
  8. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  9. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  10.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  11.    lp=LastPos("\", Pfd)
  12.    Pfd=DelStr(Pfd, 1+lp)
  13.    NDAarccot=Pfd||"NDAarccot.DAT"
  14.    bufND    =Pfd||"NDZahl.DAT"
  15.    bufMsg   =Pfd||"Meldung.DAT"
  16.    ND = LineIn(bufND, 1)
  17.  
  18.    if ND > 450 then
  19.    do
  20.      ND=450
  21.      call charout(NDAarccot) ; Call SysFileDelete NDAarccot
  22.      ret=LineOut(NDAarccot, 450)
  23.      Call Charout,"   Achtung, nur 450 Dezimalstellen bei der Berechnung von  atccot(...)"
  24.      say
  25.      Beep(444, 200); Beep(628,300)  /* Hier kein EXIT ! */
  26.    end
  27.  
  28.    /* Wenn ND <= 450 ist, wird ND = ND  weitergegeben */
  29.    call charout(NDAarccot) ; Call SysFileDelete NDAarccot
  30.    ret=LineOut(NDAarccot, ND)
  31.  
  32.    Numeric Digits ND+4
  33.  
  34.    pi24=1.||,
  35.    5707963267948966192313216916397514420985846996875529104874722961539||,
  36.    082031431044993140174126710585339910740432566411533235469223047752911158||,
  37.    626797040642405587251420513509692605527798223114744774651909822144054878||,
  38.    329667230642378241168933915826356009545728242834617301743052271633241066||,
  39.    968036301245706368622935033031577940874407604604814146270458576821839462||,
  40.    951800056652652744102332606920734759707558047165286351828797959765460930||,
  41.    5869096630589655255927403723118998137478367594287636244561396909150597456
  42.  
  43.    arg xxx,y  /* y soll "illegale" Komma's im Funktions-Argument aufspüren */
  44.    p0p=xxx*xxx /* Diese Anweisung prvoziert eine Syntax-Fehlermeldung     */
  45.    vz=sign(xxx)
  46.    xx=abs(xxx)
  47.  
  48.    if y > 0 then
  49.    do
  50.      call charout(NDAarccot) ; Call SysFileDelete NDAarccot
  51.      ret=LineOut(bufMsg, "Im Argument von  arccot(...)  ist mindestens  1  nicht zulässiges Komma !")
  52.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  53.      /*  damit in den diesbezüglichen temporären Dateien                      */
  54.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  55.      EXIT
  56.    end
  57.  
  58.    if xxx = 0 then
  59.    do
  60.      call charout(NDAarccot) ; Call SysFileDelete NDAarccot
  61.      ret=LineOut(bufMsg, "Für den Wert  x = 0  ist die Funktion  arccot(...)  nicht erklärt !")
  62.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  63.      /*  damit in den diesbezüglichen temporären Dateien                      */
  64.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  65.      EXIT
  66.    end
  67.  
  68.    if xxx=-1 then do; u=-pi24/2; Signal X; end
  69.    if xxx=+1 then do; u=+pi24/2; Signal X; end
  70.  
  71.    if 0    <  xx & xx <  0.56 then Signal A
  72.    if 0.56 <= xx & xx <  2    then
  73.    do
  74.      x=(xx-1)/(xx+1)
  75.      Signal B
  76.    end
  77.    if xx >= 2 then Signal C
  78.  
  79. A: /* atccot für 0 <= xx < 0.4142 */
  80.    y=TanArc(xx,ND)
  81.    Signal W
  82.  
  83. B: /* atccot für 0.4142 <= x < 2.414 */
  84.    y=Pi24/2+TanArc(x,ND)
  85.    Signal W
  86.  
  87. C: /* atccot für x > 2.414 */
  88.    t=xx**2; v=1; m=2; g=1
  89.    do forever
  90.      g=-g*(m-1)/(t*(m+1))
  91.      v=v+g
  92.      if abs(g/v) < 10**(-ND-7) then leave
  93.      m=m+2
  94.    end
  95.    y=pi24-v/xx
  96.  
  97. W: Numeric Digits ND
  98.    u=vz*(pi24-y)
  99. X: Return(Format(u))
  100.  
  101. EXIT
  102.  
  103. TanArc:
  104.    Procedure
  105.    arg x,ND
  106.    t=x**2; g=1; u=1; v=1; m=2
  107.    do forever
  108.      g=-t*g*(m-1)/(m+1)
  109.      v=v+g
  110.      if abs(g/v) < 10**(-ND-5 ) then leave
  111.      m=m+2
  112.    end
  113.    return(x*v)
  114.  
  115. arccotMsg:
  116.    sf=ErrorText(RC)
  117.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  118.    do
  119.      call charout(NDAarccot) ; Call SysFileDelete NDAarccot
  120.      ret=LineOut(bufMsg, "Sie haben in  arccot(...)  kein gültiges Argument eingegeben !")
  121.      /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  122.      /*  damit in den diesbezüglichen temporären Dateien                      */
  123.      /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  124.      EXIT
  125.    end
  126.  
  127.